package com.demo2.springioc;

import com.demo2.springioc.autowired.AutowiredDemo;
import com.demo2.springioc.configuration.ConfigurationDemo;
import com.demo2.springioc.controller.ControllerDemo;
import com.demo2.springioc.model.UserInfo;
import com.demo2.springioc.service.ServiceDemo;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import com.demo2.springioc.repository.RepositoryDemo;


@SpringBootApplication
public class SpringiocApplication {


//    在启动类中获取对应的对象属性
    public static void main(String[] args) {

        /**
         * 启动类获取对象和属性_test
         */

//        获取上下文
       ApplicationContext context =  SpringApplication.run(SpringiocApplication.class, args);
//
//
////       通过上下文的类对象来获取
//        ControllerDemo controllerDemo = context.getBean(ControllerDemo.class);
//        controllerDemo.Controller();




       //  通过类对象和标准名字一起获取
//        ConfigurationDemo configurationDemo = context.getBean("configurationDemo", ConfigurationDemo.class);
//        configurationDemo.configurationDemo();



//
//        通过类标准名字来获取
//        RepositoryDemo repositoryDemo = (RepositoryDemo)context.getBean("repositoryDemo");
//        repositoryDemo.repository();
//












//
//        一起用三种方式获取service
//        ServiceDemo serviceDemo  = context.getBean(ServiceDemo.class);
//        ServiceDemo serviceDemo1 = (ServiceDemo) context.getBean("serviceDemo");
//        ServiceDemo serviceDemo2 = context.getBean("serviceDemo", ServiceDemo.class);
////



//        说明获取的是同一个对象
//        System.out.println(serviceDemo);
//        System.out.println(serviceDemo1);
//        System.out.println(serviceDemo2);










//        非启动类获取测试
//        ControllerDemo controllerDemo = context.getBean(ControllerDemo.class);
//        controllerDemo.Controller();


        /**
         *
         * 对于第三方库来说，我们无法添加 @类组件
         *
         * 那么就需要在方法中 new 对应的对象来管理
         * 下面是失败的案例
         */
//        UserInfo userInfo = context.getBean(UserInfo.class);
//        System.out.println(userInfo);


//        Object userInfo1 = context.getBean("userInfo");
//        System.out.println(userInfo1);


//        写好bean 存储的方法后 测试
//        注意这里 name 就不在是规定对象名, 而是方法名
//        UserInfo userInfo = context.getBean("getUserInfo1",UserInfo.class);
//        System.out.println(userInfo);


        /**
         *
         * 构造方法可以不用加 @Autowired
         * 其他需要加入
         * 并且要注意构造方法不能冲突
         *
         */

        // 构造方法注入
//        构造方法可以不用加 @Autowired
//        RepositoryDemo repositoryDemo = context.getBean(RepositoryDemo.class);
//        repositoryDemo.repository();


        /**
         * 成员变量注入
         * 如果只有一个对象, 我们可以不需要和方法同名
         * 如果有多个对象, 要么和方法同名, 要么指定主键
         * 使用 @Qualifier 限定哪个方法中的对象.
         * 还有一种:
         * 否则报错
         */

//        RepositoryDemo repositoryDemo1 = context.getBean(RepositoryDemo.class);
//        repositoryDemo1.repository();







//        String bean1 = (String) context.getBean("getStr1");
//        String bean3 =  context.getBean("getStr1",String.class);
//        System.out.println(bean1);
//        System.out.println(bean3);






//@Autowired
//        @Resource


//
//        String bean2 = context.getBean(String.class);
//        System.out.println(bean2);
















        AutowiredDemo  demo = context.getBean(AutowiredDemo.class);
        System.out.println(demo.userInfo);











    }

}
